#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;


int cac(long long x,long long y){
	if(x == 0)
		return y;
	if(y == 0)
		return x;
	if(x > y)
		return cac(x%y,y);
	else
		return cac(x,y%x);
}


struct node{
	long long depth=0,nsum=0;
	long long p=0,q=1;
	vector<int> next;
	void operator += (node x){
		x.p *= q;
		p *= x.q;
		p += x.p;
		q *= x.q;
		int cm = cac(p,q);
		p /= cm;
		q /= cm;
		return;
	}
	void math(){
		if(nsum == 0)
			return;
//		q *= nsum;
		int cm=cac(p,nsum);
		p /= cm;
		q *= nsum/cm;
		return;
	}
};

struct pq{
	long long p,q;
	int index;
	bool operator < (const pq x)const{
//		cout<<p<<" "<<x.q<<endl;
//		cout<<1.0*p/q<<" "<<1.0*x.p/x.q;
//		cout<<endl<<"(p/q)>(x.p/x.q):"<<((p/q)>(x.p/x.q))<<endl;
		return index>x.index;
	}
};


bool cmp(pq a,pq b){
	return a.index<b.index;
}





int main(){
//	priority_queue<pq> ans;
	int n,m;
	cin>>n>>m;
	node a[n];
	int asum=0;
	for(int i=0;i<n;i++){
		int d;
		scanf("%d",&d);
		a[i].nsum = d;
		if(d == 0)
			asum++;
		for(int j=0;j<d;j++){
			int l;
			scanf("%d",&l);
			a[i].next.push_back(l-1);
			a[l-1].depth++;
		}
	}
	queue<int> q;
	for(int i=0;i<n;i++){
		if(a[i].depth == 0){
			a[i].p = 1;
			q.push(i);
		}
	}
	
	pq ans[asum];
	int aindex=0;
	while(!q.empty()){
		int now;
		now = q.front();
//		cout<<now<<endl;
		q.pop();
		a[now].math();
		if(a[now].nsum == 0){
			pq l;
			l.p = a[now].p;
			l.q = a[now].q;
			l.index = now;
			ans[aindex++] = l;
//			cout<<now<<endl;
		}
//		cout<<now<<endl;
		for(int i=0;i<a[now].nsum;i++){
			a[a[now].next[i]].depth--;
			a[a[now].next[i]] += a[now];
			if(a[a[now].next[i]].depth == 0)
				q.push(a[now].next[i]);
		}
	}
//	cout<<ans.size()<<endl<<endl;
//	for(int i=0;i<n;i++){
//		cout<<a[i].p<<" "<<a[i].q<<endl;
//	}
//	cout<<ans.size();
	sort(ans,ans+asum,cmp);
//	while(!ans.empty()){
//		pq l;
//		l = ans.top();
//		ans.pop();
////		cout<<l.p<<" "<<l.q<<endl;
////		int k=cac(l.p,l.q);
////		cout<<l.p/k<<" "<<l.q/k<<endl;
//        printf("%d %d\n",l.p,l.q);
//	}
	for(int i=0;i<asum;i++){
		printf("%d %d\n",ans[i].p,ans[i].q);
	}
	return 0;
}
